package com.lu.pojo.oop.interfaces;

/**
 * @author luzhenfang
 * @date  2020 05 09
 * @description  接口抽象类对比
 *  接口（interface）是与类并行的一个概念
     *  - 接口和接口之间是继承关系 接口之间可以多继承
     *  - 类可以实现多个接口  java中继承是单继承的
     *  - 实现接口的类必须要重新其中的所有抽象方法，方可实例化，若没有重写所有的抽象方法，则此类仍为一个抽象类
     *  - class XXX extends AA implements BB
     *  - 接口定义的就是一种功能。可以被类所实现(implements)
     *  - 接口没有构造器
     *  - 不能包含变量，一般的方法。
     *  - 接口可以看做是一个特殊的抽象类，是常量与方法的一个集合。
 *
 * 1、共同点：
     * 都可以有抽象方法
     * 都不能new
     * 都是用来被子类继承或者实现的。
 * 2、区别
     * 语法
         * 成员变量   接口只有常量，没有变量
         * 成员方法   接口的方法全部都是抽象方法，抽象类可以0个，1个或者多个抽象方法
         * 一个类只能继承一个抽象类，但是可以同时实现多个接口。
     * 语义
         * 抽象类：is-a  Bird  is  a  Animal 中间产品  最终产品   模板
         * 接口：has-a Plane/Bird/SuperMan  has an flyable ability具有什么能力  遵守什么规范
         *
 * 3、接口的使用
     * 接口是一种能力，体现在接口的方法上。
     * 面向接口编程：
     * 程序设计时，只需关心实现类有何能力，而不关心实现细节。
     * 面向接口的约定而不考虑接口的具体实现
 * 4、接口有比抽象类更好的特性
     * 可以被多继承
     * 设计和实现完全分离
     * 更自然的使用多态
     * 更容易搭建程序框架
     * 更容易更换实现
 *
 * 实现了接口后创建子类对象时过程没有任何变化，接口和类不是继承关系，接口也没有构造方法。
 */
public class TestInterface {
    public static void main(String[] args) {
        System.out.println(IPerson.age);
        // Person.age=20; //Cannot assign a value to final variable 'age'
        Man man = new Man();
        man.drink();
        man.eat();
        man.getWeight();
        man.getHeight();


        ImplDuck implDuck = new ImplDuck();
        implDuck.run();
        implDuck.fly();
        implDuck.swim();
        testRun(implDuck);
        testSwim(implDuck);
        testFly(implDuck);


        // 多态深入理解
        Computer computer = new Computer();
        IUSB implFlash = new ImplFlash();
        IUSB implPrinter = new ImplPrinter();
        computer.doWork(implFlash);
        computer.doWork(implPrinter);


        // 实现接口匿名类对象
       IUSB phone = new IUSB() {
            @Override
            public void start() {
                System.out.println("手机开始工作");
            }

            @Override
            public void stop() {
                System.out.println("手机停止工作");
            }

        };
       computer.doWork(phone);
    }

    // 接口之间的多态
    // IRunner = new Duck();
    public static void testRun(IRunner r){
        r.run();
        System.out.println(r.getClass());
    }
    // ISwimer s = new Duck();
    public static void testSwim(ISwimer s){
        s.swim();
        System.out.println(s.getClass());
    }
    // IFlier f = new Duck();
    public static void testFly(IFlier f){
        f.fly();
        System.out.println(f.getClass());
    }
}
